﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;

namespace Studio7i.Persistencia
{
    public class LocalDAO : ILocalDAO
    {
        // Métodos CRUD
        public Local Crear(Local localACrear)
        {
            string _Sentencia = "INSERT INTO Local(CodLocal,Nombre,Direccion,Distrito) VALUES(@codigo,@nombre,@direccion,@distrito)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", localACrear.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@direccion", localACrear.Direccion));
                    _Comando.Parameters.Add(new SqlParameter("@distrito", localACrear.Distrito));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Local Obtener(int codigo)
        {
            string _Sentencia = "SELECT CodLocal,Nombre,Direccion,Distrito FROM local WHERE CodLocal=@codigo";
            Local localCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            localCreado = new Local();
                            localCreado.CodLocal = _Resultado.GetInt32(0);
                            localCreado.Nombre = (string)_Resultado["Nombre"];
                            localCreado.Direccion = (string)_Resultado["Direccion"];
                            localCreado.Distrito = (string)_Resultado["Distrito"];
                        }
                    }
                }
            }
            return localCreado;
        }
        public Local Modificar(Local localAModificar)
        {
            string _Sentencia = "UPDATE local SET Nombre=@Nombre,Direccion=@Direccion,Distrito=@Distrito WHERE Codlocal=@CodLocal";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", localAModificar.CodLocal));
                    _Comando.Parameters.Add(new SqlParameter("@Nombre", localAModificar.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@Direccion", localAModificar.Direccion));
                    _Comando.Parameters.Add(new SqlParameter("@Distrito", localAModificar.Distrito));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(localAModificar.CodLocal);
        }

        public void Eliminar(Local localAEliminar)
        {
            string _Sentencia = "DELETE  FROM local WHERE CodLocal=@CodLocal";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", localAEliminar.CodLocal));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Local> ListarTodos()
        {
            string _Sentencia = "SELECT CodLocal, Nombre, Direccion, Distrito FROM local";
            ICollection<Local> localesEncontrados = new List<Local>();
            Local localEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            localEncontrado = new Local();
                            localEncontrado.CodLocal = _Resultado.GetInt32(0);
                            localEncontrado.Nombre = (string)_Resultado["Nombre"];
                            localEncontrado.Direccion = (string)_Resultado["Direccion"];
                            localEncontrado.Distrito = (string)_Resultado["Distrito"];
                            localesEncontrados.Add(localEncontrado);
                        }
                    }
                }
            }
            return localesEncontrados;
        }

        public ICollection<Local> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT codigo,nombre,direccion,distrito FROM local WHERE nombre LIKE '%'+@nombre+'%'";
            ICollection<Local> localesEncontrados = new List<Local>();
            Local localEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            localEncontrado = new Local();
                            localEncontrado.CodLocal = _Resultado.GetInt32(0);
                            localEncontrado.Nombre = (String)_Resultado["nombre"];
                            localEncontrado.Direccion = (String)_Resultado["direccion"];
                            localEncontrado.Distrito = (String)_Resultado["distrito"];
                            localesEncontrados.Add(localEncontrado);
                        }
                    }
                }
            }
            return localesEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(Codlocal) FROM Local";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }

            return _NuevoCodigo;

        }

    }
}
